/**
 * 删除 DOM 节点
 * 删除逻辑：
 *    1、节点是文本节点就可以直接删除
 *    2、节点是组件，需要调用组件卸载生命周期函数
 *    3、节点包含其他组件生成的节点，需要调用其他组件卸载生命周期函数
 *    4、节点有 ref 属性，需要删除通过 ref 属性传递给组件的 DOM 节点对象
 *    5、节点有事件，需要删除事件对应的处理函数
 * @param {*} node 
 */
export default function unmountNode(node) {
  // 获取节点的 virtualDOM 对象
  const virtualDOM = node._virtualDOM
  // 文本节点
  if (virtualDOM.type === 'text') {
    node.remove()
    return
  }
  // 节点是组件
  let component = virtualDOM.component
  if (component) {
    component.componentWillUnmount()
  }

  // 节点有 ref 属性
  if (virtualDOM.props && virtualDOM.props.ref) {
    virtualDOM.props.ref(null)
  }

  // 节点有事件
  Object.keys(virtualDOM.props).forEach(propName => {
    if (propName.slice(0, 2) === 'on') {
      const eventName = propName.toLowerCase().slice(2)
      // console.log(eventName)
      const eventHandler = virtualDOM.props[propName]
      node.removeEventListener(eventName, eventHandler)
    }
  })

  // 节点包含子节点
  if (node.childNodes.length > 0) {
    for (let i = 0; i < node.childNodes.length; i++) {
      unmountNode(node.childNodes[i])
      i--
    }
  }
  
  // 删除节点
  node.remove()
}